package com.gec.system.exception;


import com.gec.system.util.Result;
import com.gec.system.util.ResultCodeEnum;
import org.springframework.security.access.AccessDeniedException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;


/**
 * 系统异常类
 */
@ControllerAdvice //标记当前类是一个异常的处理类
public class GlobalException {

    /**
     * 全局异常
     * 任何异常都会触发该方法
     * @param e
     * @return
     */
    @ExceptionHandler(Exception.class) //只要出现了任何的异常，该方法都会被触发
    @ResponseBody //返回json格式数据结果
    public Result error(Exception e)
    {
        System.out.println("全局执行....");
        e.printStackTrace(); //打印异常堆栈信息
        return Result.fail().message("执行了全局异常处理...");
    }

    /**
     * 明确指定异常类型
     * 只有当异常类型是指定的ArithmeticException，该方法才会被执行，从而可以给出不同的提示信息
     * @param e
     * @return
     */
    @ExceptionHandler(ArithmeticException.class)
    @ResponseBody
    public Result error(ArithmeticException e)
    {
        System.out.println("特定执行.");
        e.printStackTrace();
        return Result.fail().message("执行了特定异常处理..");
    }


    /**
     * 自定义异常类
     * 添加进全局异常
     * @param e
     * @return
     */
    @ExceptionHandler(MyCustomerException.class)
    @ResponseBody
    public Result error(MyCustomerException e)
    {
        System.out.println("自定义异常执行.");
        e.printStackTrace();
        return Result.fail().code(e.getCode()).message(e.getMsg());
    }

    /**
     * spring security异常
     * @param e
     * @return
     */
    @ExceptionHandler(AccessDeniedException.class)
    @ResponseBody
    public Result error(AccessDeniedException e) throws AccessDeniedException {
        return Result.fail().code(ResultCodeEnum.PERMISSION.getCode()).message("没有当前操作权限");
    }

}